from PySide6.QtWidgets import QApplication, QComboBox, QVBoxLayout, QWidget, QPushButton, QLineEdit, QLabel, QGroupBox, \
    QHBoxLayout, \
    QInputDialog, QFileDialog, QFontDialog, QColorDialog, QTextEdit
from PySide6.QtCore import Qt

import sys

class MyWindow(QWidget):
    def __init__(self) -> None:
        super().__init__()
        self.setWindowTitle("04_QDialog ")
        # 1. QMessageBox 参考：01_BV16d4y1s73t_202403/5_QMessageBox_消息弹框.py
        
        # 2. ====================================== QInputDialog ======================================
        input_dialog_groupBox = QGroupBox('=== QInputDialog ===')
        #   > 2.1 获取整数
        input_btn1 = QPushButton('获取整数')
        input_btn1.clicked.connect(self.getInputDialog)

        #   > 2.2 获取浮点数
        input_btn2 = QPushButton('获取浮点数')
        input_btn2.clicked.connect(lambda: print(QInputDialog.getDouble(self, '标题', '标签/内容', 1, 0, 100, 2)))
        
        #   > 2.3 获取Item：下拉框选项
        input_btn3 = QPushButton('获取Item：下拉框选项')
        input_btn3.clicked.connect(lambda: print(QInputDialog.getItem(self, '标题', '标签/内容', ['张三', '里斯','王五'], 0, False)))
        
        #   > 2.4 获取单行文本
        input_btn4 = QPushButton('获取单行文本')
        input_btn4.clicked.connect(lambda: print(QInputDialog.getText(self, '标题', '标签/内容', QLineEdit.EchoMode.Password)))
        
        #   > 2.5 获取多行文本
        input_btn5 = QPushButton('获取多行文本')
        input_btn5.clicked.connect(lambda: print(QInputDialog.getMultiLineText(self, '标题', '标签/内容')))
        
    
        inputDialog_layout = QVBoxLayout()
        inputDialog_layout.addWidget(input_btn1)
        inputDialog_layout.addWidget(input_btn2)
        inputDialog_layout.addWidget(input_btn3)
        inputDialog_layout.addWidget(input_btn4)
        inputDialog_layout.addWidget(input_btn5)
        input_dialog_groupBox.setLayout(inputDialog_layout)
        
        
        # 3. ====================================== QFileDialog ======================================
        file_dialog_groupBox = QGroupBox('=== QFileDialog ===')
        #   > 3.1 选择单个文件
        file_btn1 = QPushButton('3.1 选择单个文件')
        '''
            第3个参数 - dir         打开的默认文件路径（.表示当前路径）
            第4个参数 - filter      对文件按照括号内的规则进行过滤，多个使用 ;; 分隔
        '''
        file_btn1.clicked.connect(lambda: print(QFileDialog.getOpenFileName(self, '标题', '.', '所有文件(*);;Python文件(*.py)')))
        
        #   > 3.2 选择多个文件
        file_btn2 = QPushButton('3.2 选择多个文件')
        '''
            返回的是（选择文件绝对路径的数组，过滤类型）的元组
        '''
        file_btn2.clicked.connect(lambda: print(QFileDialog.getOpenFileNames(self, '标题', '.', '所有文件(*);;Python文件(*.py)')))
        
        #   > 3.3 选择文件夹
        file_btn3 = QPushButton('3.3 选择文件夹')
        '''
            ！！！返回的是文件绝对路径的字符串
        '''
        file_btn3.clicked.connect(lambda: print(QFileDialog.getExistingDirectory(self, '标题', '.')))
        
        #   > 3.4 保存文件
        file_btn4 = QPushButton('3.4 设置保存文件')
        '''
            返回的是 (保存文件的绝对路径, 文件类型) 的元组
            P.S. 这里的具体文件保存不是这么简单的
        '''
        file_btn4.clicked.connect(lambda: print(QFileDialog.getSaveFileName(self, '标题', '.', 'Python文件(*.py)')))
        
        fileDialog_layout = QVBoxLayout()
        fileDialog_layout.addWidget(file_btn1)
        fileDialog_layout.addWidget(file_btn2)
        fileDialog_layout.addWidget(file_btn3)
        fileDialog_layout.addWidget(file_btn4)

        file_dialog_groupBox.setLayout(fileDialog_layout)
        
        
        # 4. ====================================== QFontDialog & QColorDialog ======================================
        font_dialog_groupBox = QGroupBox('=== QFontDialog & QColorDialog ===')
        self.text_edit = QTextEdit("请输入文字")
        font_btn = QPushButton("点击切换字体")
        color_btn = QPushButton("点击切换颜色")
        font_btn.clicked.connect(self.changeFont)
        color_btn.clicked.connect(self.changeColor)

        fontDialog_layout = QVBoxLayout()
        fontDialog_layout.addWidget(self.text_edit)
        fontDialog_layout.addWidget(font_btn)
        fontDialog_layout.addWidget(color_btn)

        font_dialog_groupBox.setLayout(fontDialog_layout)

        
        # =================== 整体布局，以下 ===================
        layout = QVBoxLayout()
        layout_line01 = QHBoxLayout()
        layout_line01.addWidget(input_dialog_groupBox)
        layout_line01.addWidget(file_dialog_groupBox)

        layout_line02 = QVBoxLayout()
        layout_line02.addWidget(font_dialog_groupBox)

        layout.addLayout(layout_line01)
        layout.addLayout(layout_line02)
        self.setLayout(layout)
        
    def getInputDialog(self):
        # 不清楚这里使用全参数为啥会报错？
        # reply, ok = QInputDialog.getInt(self, title='标题', label='标签/内容', value=1, minValue=0, maxValue=100, step=1, flags=Qt.WindowType.Dialog)
        reply, ok = QInputDialog.getInt(self, '标题', '标签/内容', 1, 0, 100, 1)
        if ok:
            print(f'获取到整数：{reply}')

    def textChanged(self, text):
        print(text)

    def changeColor(self):
        color = QColorDialog.getColor()
        self.text_edit.setTextColor(color)

    def changeFont(self):
        ok, font = QFontDialog.getFont()
        if not ok: return
        self.text_edit.setFont(font)

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = MyWindow()
    window.show()

    app.exec()